package org.dromara.common.tenant.handle

import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper
import io.github.oshai.kotlinlogging.KotlinLogging
import org.dromara.common.core.constant.GlobalConstants
import org.dromara.common.core.utils.StringUtils
import org.dromara.common.redis.handler.KeyPrefixHandler
import org.dromara.common.tenant.helper.TenantHelper

/**
 * 多租户redis缓存key前缀处理
 *
 * @author LikeYouDo
 * @date 2025/07/26
 */
class TenantKeyPrefixHandler(keyPrefix: String) : KeyPrefixHandler(keyPrefix) {

    companion object {
        private val log = KotlinLogging.logger { }
    }

    /**
     * 增加前缀
     */
    override fun map(name: String): String? {
        if (StringUtils.isBlank(name)) {
            return null
        }
        try {
            if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) {
                return super.map(name)
            }
        } catch (ignore: NoClassDefFoundError) {
            // 有些服务不需要mp导致类不存在 忽略即可
        }
        if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
            return super.map(name)
        }
        val tenantId = TenantHelper.getTenantId()
        if (StringUtils.isBlank(tenantId)) {
            log.debug { "无法获取有效的租户id -> Null" }
            return super.map(name)
        }
        if (StringUtils.startsWith(name, tenantId + "")) {
            // 如果存在则直接返回
            return super.map(name)
        }
        return super.map("$tenantId:$name")
    }

    /**
     * 去除前缀
     */
    override fun unmap(name: String): String? {
        val unmap = super.unmap(name)
        if (unmap.isNullOrBlank()) {
            return null
        }
        try {
            if (InterceptorIgnoreHelper.willIgnoreTenantLine("")) {
                return super.unmap(name)
            }
        } catch (ignore: NoClassDefFoundError) {
            // 有些服务不需要mp导致类不存在 忽略即可
        }
        if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
            return unmap
        }
        val tenantId = TenantHelper.getTenantId()
        if (StringUtils.isBlank(tenantId)) {
            log.debug { "无法获取有效的租户id -> Null" }
            return unmap
        }
        if (StringUtils.startsWith(unmap, tenantId + "")) {
            // 如果存在则删除
            return unmap.substring(("$tenantId:").length)
        }
        return unmap
    }
}
